Send ordinal values. These are unaccelerated values for the various events that allow the client to choose which values to use. BUG=chromium-os:36802 TEST=On device Change-Id: I7c3c0eba73dac16014bcea0fdd6bc43b5c69f5a5 Reviewed-on: https://gerrit.chromium.org/gerrit/42951 Tested-by: Dave Moore <davemoore@chromium.org> Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> Commit-Queue: Dave Moore <davemoore@chromium.org> 
diff --git a/src/cmt.c b/src/cmt.c index fee2aac..b9730a2 100644 --- a/src/cmt.c +++ b/src/cmt.c 
@@ -27,6 +27,9 @@  #error Unsupported XInput version. Major version 12 and above required.  #endif   +#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X" +#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y" +  #define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State"  #define AXIS_LABEL_PROP_ABS_DBL_FLING_VX "Abs Dbl Fling X Velocity"  #define AXIS_LABEL_PROP_ABS_DBL_FLING_VY "Abs Dbl Fling Y Velocity" @@ -352,6 +355,8 @@  static const char* axes_names[CMT_NUM_AXES] = {  AXIS_LABEL_PROP_REL_X,  AXIS_LABEL_PROP_REL_Y, + AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X, + AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y,  AXIS_LABEL_PROP_REL_HWHEEL,  AXIS_LABEL_PROP_REL_WHEEL,  AXIS_LABEL_PROP_ABS_FLING_STATE, 
diff --git a/src/cmt.h b/src/cmt.h index 866f5f4..81e1903 100644 --- a/src/cmt.h +++ b/src/cmt.h 
@@ -39,6 +39,8 @@  enum CMT_AXIS {  CMT_AXIS_X = 0,  CMT_AXIS_Y, + CMT_AXIS_ORDINAL_X, + CMT_AXIS_ORDINAL_Y,  CMT_AXIS_SCROLL_X,  CMT_AXIS_SCROLL_Y,  CMT_AXIS_FLING_STATE, 
diff --git a/src/gesture.c b/src/gesture.c index 9a0cbac..68e1e3f 100644 --- a/src/gesture.c +++ b/src/gesture.c 
@@ -228,6 +228,25 @@  valuator_mask_set_double(mask, CMT_AXIS_DBL_END_TIME, end_time);  }   +static void SetOrdinalValues(ValuatorMask* mask, + DeviceIntPtr dev, + float x, + float y, + BOOL is_absolute) { + if (!is_absolute) { + /* + * We send the movement axes as relative values, which causes the + * times to be sent as relative values too. This code computes the + * right relative values. + */ + x -= dev->last.valuators[CMT_AXIS_ORDINAL_X]; + y -= dev->last.valuators[CMT_AXIS_ORDINAL_Y]; + } + + valuator_mask_set_double(mask, CMT_AXIS_ORDINAL_X, x); + valuator_mask_set_double(mask, CMT_AXIS_ORDINAL_Y, y); +} +  static void Gesture_Gesture_Ready(void* client_data,  const struct Gesture* gesture)  { @@ -246,20 +265,32 @@  break;  case kGestureTypeMove: {  const GestureMove* move = &gesture->details.move; - DBG(info, "Gesture Move: (%f, %f)\n", move->dx, move->dy); + DBG(info, "Gesture Move: (%f, %f) [%f, %f]\n", + move->dx, move->dy, move->ordinal_dx, move->ordinal_dy);  valuator_mask_set_double(mask, CMT_AXIS_X, move->dx);  valuator_mask_set_double(mask, CMT_AXIS_Y, move->dy);  SetTimeValues(mask, gesture, dev, FALSE); + SetOrdinalValues(mask, + dev, + move->ordinal_dx, + move->ordinal_dy, + FALSE);  xf86PostMotionEventM(dev, FALSE, mask);  break;  }  case kGestureTypeScroll: {  const GestureScroll* scroll = &gesture->details.scroll; - DBG(info, "Gesture Scroll: (%f, %f)\n", scroll->dx, scroll->dy); + DBG(info, "Gesture Scroll: (%f, %f) [%f, %f]\n", + scroll->dx, scroll->dy, scroll->ordinal_dx, scroll->ordinal_dy);  valuator_mask_set_double(mask, CMT_AXIS_SCROLL_X, scroll->dx);  valuator_mask_set_double(mask, CMT_AXIS_SCROLL_Y, scroll->dy);  valuator_mask_set_double(mask, CMT_AXIS_FINGER_COUNT, 2.0);  SetTimeValues(mask, gesture, dev, TRUE); + SetOrdinalValues(mask, + dev, + scroll->ordinal_dx, + scroll->ordinal_dy, + TRUE);  xf86PostMotionEventM(dev, TRUE, mask);  break;  } @@ -284,22 +315,34 @@  }  case kGestureTypeFling: {  const GestureFling* fling = &gesture->details.fling; - DBG(info, "Gesture Fling: vx=%f vy=%f fling_state=%d\n", - fling->vx, fling->vy, fling->fling_state); + DBG(info, "Gesture Fling: (%f, %f) [%f, %f] fling_state=%d\n", + fling->vx, fling->vy, fling->ordinal_vx, fling->ordinal_vy, + fling->fling_state);  valuator_mask_set_double(mask, CMT_AXIS_DBL_FLING_VX, fling->vx);  valuator_mask_set_double(mask, CMT_AXIS_DBL_FLING_VY, fling->vy);  valuator_mask_set(mask, CMT_AXIS_FLING_STATE, fling->fling_state);  SetTimeValues(mask, gesture, dev, TRUE); + SetOrdinalValues(mask, + dev, + fling->ordinal_vx, + fling->ordinal_vy, + TRUE);  xf86PostMotionEventM(dev, TRUE, mask);  break;  }  case kGestureTypeSwipe: {  const GestureSwipe* swipe = &gesture->details.swipe; - DBG(info, "Gesture Swipe: dx=%f dy=%f\n", swipe->dx, swipe->dy); + DBG(info, "Gesture Swipe: (%f, %f) [%f, %f]\n", + swipe->dx, swipe->dy, swipe->ordinal_dx, swipe->ordinal_dy);  valuator_mask_set_double(mask, CMT_AXIS_SCROLL_X, swipe->dx);  valuator_mask_set_double(mask, CMT_AXIS_SCROLL_Y, swipe->dy);  valuator_mask_set_double(mask, CMT_AXIS_FINGER_COUNT, 3.0);  SetTimeValues(mask, gesture, dev, TRUE); + SetOrdinalValues(mask, + dev, + swipe->ordinal_dx, + swipe->ordinal_dy, + TRUE);  xf86PostMotionEventM(dev, TRUE, mask);  break;  } @@ -314,7 +357,8 @@  break;  case kGestureTypePinch: {  const GesturePinch* pinch = &gesture->details.pinch; - DBG(info, "Gesture Pinch: dz=%f\n", pinch->dz); + DBG(info, "Gesture Pinch: dz=%f [%f]\n", + pinch->dz, pinch->ordinal_dz);  break;  }  default: